/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * 左右中，后序遍历
 * @param {TreeNode} root
 * @return {boolean}
 */
var isBalanced = function (root) {
    if (root === null) return true
    return getNodeDiff(root) !== -1
};

// 确定入参和返回值，空节点返回高度为0，正常返回节点高度，叶子节点从1开始往上（求解深度，是根节点从1开始往下）
// 如果左右节点高度差大于1，返回-1
// 最后递归到根节点，看根节点的值是否不等于-1
function getNodeDiff(root) {
    // 明确终止条件
    if (root === null) {
        return 0
    }

    let leftHeight = getNodeDiff(root.left),
        rightHeight = getNodeDiff(root.right),
        heightDiff = Math.abs(leftHeight - rightHeight)
    // 有同时左右节点都为-1的情况，或单个节点为-1(差值可能小于等于1)，此时此节点的父节点也赋值-1
    if(leftHeight === -1 || rightHeight === -1){
        return -1
    }

    if (heightDiff > 1) {
        return -1
    } else {
        return 1 + Math.max(leftHeight, rightHeight)
    }
}